const { execSync } = require('child_process');
const Client = require('ssh2-sftp-client');


const devConfig = { // 开发环境
  ip: "xxx.xxx.xx.xx", // 开发环境
  username: "root", // 用户名
  port: "22", //端口
  password: "xxxx@123", // 密码
  path: '/xx/xx/xxx', // 服务器上要上传包的目录
  fileName: 'c6_basic',
};

const proConfig = { // 生成环境
  ip: "xxx.xxx.xx.xx", // 服务器地址
  username: "root", // 用户名
  port: "22", //端口
  password: "xxxx@123", // 密码
  path: '/xx/xx/xxx', // 服务器上要上传包的目录
  fileName: 'c6_basic',
};

// npm run release dev
// npm run release pro
const config = process.argv[2] === 'pro' ? proConfig : devConfig;

const sourceDir = `${__dirname}/${config.fileName}`; //本地源文件目录
const serviceSourceDir = `${config.path}/${config.fileName}`; //服务器源文件目录 /opt/static/application/c6_basic

// 打包 npm run build
async function compileDist() {
  try {
    const result = execSync('npm run build', { stdio: 'inherit' });
    console.log("打包成功");
    return Promise.resolve();
  } catch (error) {
    console.error(`打包失败: ${error}`);
    process.exit(0);
  }
}

async function connectSSh() {
  let sftp = new Client();
  const timeNow = formatDate();
  const backupFilePath = `${serviceSourceDir}_${timeNow}`; //备份文件
  sftp.connect({
    host: config.ip, // 服务器 IP
    port: config.port,
    username: config.username,
    password: config.password,
  })
    .then(async () => {
    //将远程文件重命名备份
      const isExists = await sftp.exists(serviceSourceDir);
      if (isExists) {
        await sftp.rename(serviceSourceDir, backupFilePath).catch((err) => console.log('备份操作失败', err));
      } else {
      // 如果路径不存在，请手动创建后再运行该脚本
        console.log(`服务器上${serviceSourceDir}不存在，请先确认目录路径是否正确`);
        process.exit(0);
      }
    })
    .then(() => {
    //创建空文件夹c6_basic
      return sftp.mkdir(serviceSourceDir, true);
    })
    .then(() => {
      // 上传文件
      console.log("开始上传");
      // 创建进度条 并写入
      // return uploadFileWithProgress(sourceDir, serviceSourceDir, sftp);
      return sftp.uploadDir(sourceDir, serviceSourceDir);
    }, async(err) => {
      console.log(err, '创建文件夹失败');
      // 恢复备份文件
      await sftp.rename(backupFilePath, serviceSourceDir).catch((err) => console.log('恢复备份文件失败，请到服务器手动操作', err));
    })
    .then(async() => {
    // 上传文件
      console.log("上传成功");
      // 删除备份文件
      await sftp.rmdir(backupFilePath, true).catch((err) => console.log('删除备份失败', err));
    }, (err) => {
      console.log(err, '上传失败');
      // 删除未成功的文件
      sftp.delete(serviceSourceDir).then(() => {
      //恢复备份文件
        sftp.rename(backupFilePath, serviceSourceDir);
      });
    })
    .finally(() => {
      sftp.end();
    });
}
async function runTask() {
  await compileDist(); //打包
  await connectSSh(); //提交上传
}

function formatDate() {
  const now = new Date();
  const year = now.getFullYear(); // 获取年份
  const month = String(now.getMonth() + 1).padStart(2, '0'); // 获取月份，并补零
  const day = String(now.getDate()).padStart(2, '0'); // 获取日期，并补零
  const hours = String(now.getHours()).padStart(2, '0'); // 获取小时，并补零
  const minutes = String(now.getMinutes()).padStart(2, '0'); // 获取分钟，并补零
  const seconds = String(now.getSeconds()).padStart(2, '0'); // 获取秒，并补零
  // 按照指定格式拼接字符串
  return `${year}:${month}:${day}-${hours}:${minutes}:${seconds}`;
}

runTask();